/* * Copyright 2001-2006 Stephen Colebourne * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.joda.time; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import junit.framework.TestCase; import junit.framework.TestSuite; /** * This class is a Junit unit test for Months. * * @author Stephen Colebourne */ public class TestMonths extends TestCase { // Test in 2002/03 as time zones are more well known // (before the late 90's they were all over the place) private static final DateTimeZone PARIS = DateTimeZone.forID("Europe/Paris"); public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static TestSuite suite() { return new TestSuite(TestMonths.class); } public TestMonths(String name) { super(name); } protected void setUp() throws Exception { } protected void tearDown() throws Exception { } //----------------------------------------------------------------------- public void testConstants() { assertEquals(0, Months.ZERO.getMonths()); assertEquals(1, Months.ONE.getMonths()); assertEquals(2, Months.TWO.getMonths()); assertEquals(3, Months.THREE.getMonths()); assertEquals(4, Months.FOUR.getMonths()); assertEquals(5, Months.FIVE.getMonths()); assertEquals(6, Months.SIX.getMonths()); assertEquals(7, Months.SEVEN.getMonths()); assertEquals(8, Months.EIGHT.getMonths()); assertEquals(9, Months.NINE.getMonths()); assertEquals(10, Months.TEN.getMonths()); assertEquals(11, Months.ELEVEN.getMonths()); assertEquals(12, Months.TWELVE.getMonths()); assertEquals(Integer.MAX_VALUE, Months.MAX_VALUE.getMonths()); assertEquals(Integer.MIN_VALUE, Months.MIN_VALUE.getMonths()); } //----------------------------------------------------------------------- public void testFactory_months_int() { assertSame(Months.ZERO, Months.months(0)); assertSame(Months.ONE, Months.months(1)); assertSame(Months.TWO, Months.months(2)); assertSame(Months.THREE, Months.months(3)); assertSame(Months.FOUR, Months.months(4)); assertSame(Months.FIVE, Months.months(5)); assertSame(Months.SIX, Months.months(6)); assertSame(Months.SEVEN, Months.months(7)); assertSame(Months.EIGHT, Months.months(8)); assertSame(Months.NINE, Months.months(9)); assertSame(Months.TEN, Months.months(10)); assertSame(Months.ELEVEN, Months.months(11)); assertSame(Months.TWELVE, Months.months(12)); assertSame(Months.MAX_VALUE, Months.months(Integer.MAX_VALUE)); assertSame(Months.MIN_VALUE, Months.months(Integer.MIN_VALUE)); assertEquals(-1, Months.months(-1).getMonths()); assertEquals(13, Months.months(13).getMonths()); } //----------------------------------------------------------------------- public void testFactory_monthsBetween_RInstant() { DateTime start = new DateTime(2006, 6, 9, 12, 0, 0, 0, PARIS); DateTime end1 = new DateTime(2006, 9, 9, 12, 0, 0, 0, PARIS); DateTime end2 = new DateTime(2006, 12, 9, 12, 0, 0, 0, PARIS); assertEquals(3, Months.monthsBetween(start, end1).getMonths()); assertEquals(0, Months.monthsBetween(start, start).getMonths()); assertEquals(0, Months.monthsBetween(end1, end1).getMonths()); assertEquals(-3, Months.monthsBetween(end1, start).getMonths()); assertEquals(6, Months.monthsBetween(start, end2).getMonths()); } public void testFactory_monthsBetween_RPartial() { LocalDate start = new LocalDate(2006, 6, 9); LocalDate end1 = new LocalDate(2006, 9, 9); YearMonthDay end2 = new YearMonthDay(2006, 12, 9); assertEquals(3, Months.monthsBetween(start, end1).getMonths()); assertEquals(0, Months.monthsBetween(start, start).getMonths()); assertEquals(0, Months.monthsBetween(end1, end1).getMonths()); assertEquals(-3, Months.monthsBetween(end1, start).getMonths()); assertEquals(6, Months.monthsBetween(start, end2).getMonths()); } public void testFactory_monthsIn_RInterval() { DateTime start = new DateTime(2006, 6, 9, 12, 0, 0, 0, PARIS); DateTime end1 = new DateTime(2006, 9, 9, 12, 0, 0, 0, PARIS); DateTime end2 = new DateTime(2006, 12, 9, 12, 0, 0, 0, PARIS); assertEquals(0, Months.monthsIn((ReadableInterval) null).getMonths()); assertEquals(3, Months.monthsIn(new Interval(start, end1)).getMonths()); assertEquals(0, Months.monthsIn(new Interval(start, start)).getMonths()); assertEquals(0, Months.monthsIn(new Interval(end1, end1)).getMonths()); assertEquals(6, Months.monthsIn(new Interval(start, end2)).getMonths()); } public void testFactory_parseMonths_String() { assertEquals(0, Months.parseMonths((String) null).getMonths()); assertEquals(0, Months.parseMonths("P0M").getMonths()); assertEquals(1, Months.parseMonths("P1M").getMonths()); assertEquals(-3, Months.parseMonths("P-3M").getMonths()); assertEquals(2, Months.parseMonths("P0Y2M").getMonths()); assertEquals(2, Months.parseMonths("P2MT0H0M").getMonths()); try { Months.parseMonths("P1Y1D"); fail(); } catch (IllegalArgumentException ex) { // expeceted } try { Months.parseMonths("P1MT1H"); fail(); } catch (IllegalArgumentException ex) { // expeceted } } //----------------------------------------------------------------------- public void testGetMethods() { Months test = Months.months(20); assertEquals(20, test.getMonths()); } public void testGetFieldType() { Months test = Months.months(20); assertEquals(DurationFieldType.months(), test.getFieldType()); } public void testGetPeriodType() { Months test = Months.months(20); assertEquals(PeriodType.months(), test.getPeriodType()); } //----------------------------------------------------------------------- public void testIsGreaterThan() { assertEquals(true, Months.THREE.isGreaterThan(Months.TWO)); assertEquals(false, Months.THREE.isGreaterThan(Months.THREE)); assertEquals(false, Months.TWO.isGreaterThan(Months.THREE)); assertEquals(true, Months.ONE.isGreaterThan(null)); assertEquals(false, Months.months(-1).isGreaterThan(null)); } public void testIsLessThan() { assertEquals(false, Months.THREE.isLessThan(Months.TWO)); assertEquals(false, Months.THREE.isLessThan(Months.THREE)); assertEquals(true, Months.TWO.isLessThan(Months.THREE)); assertEquals(false, Months.ONE.isLessThan(null)); assertEquals(true, Months.months(-1).isLessThan(null)); } //----------------------------------------------------------------------- public void testToString() { Months test = Months.months(20); assertEquals("P20M", test.toString()); test = Months.months(-20); assertEquals("P-20M", test.toString()); } //----------------------------------------------------------------------- public void testSerialization() throws Exception { Months test = Months.THREE; ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(test); byte[] bytes = baos.toByteArray(); oos.close(); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); Months result = (Months) ois.readObject(); ois.close(); assertSame(test, result); } //----------------------------------------------------------------------- public void testPlus_int() { Months test2 = Months.months(2); Months result = test2.plus(3); assertEquals(2, test2.getMonths()); assertEquals(5, result.getMonths()); assertEquals(1, Months.ONE.plus(0).getMonths()); try { Months.MAX_VALUE.plus(1); fail(); } catch (ArithmeticException ex) { // expected } } public void testPlus_Months() { Months test2 = Months.months(2); Months test3 = Months.months(3); Months result = test2.plus(test3); assertEquals(2, test2.getMonths()); assertEquals(3, test3.getMonths()); assertEquals(5, result.getMonths()); assertEquals(1, Months.ONE.plus(Months.ZERO).getMonths()); assertEquals(1, Months.ONE.plus((Months) null).getMonths()); try { Months.MAX_VALUE.plus(Months.ONE); fail(); } catch (ArithmeticException ex) { // expected } } public void testMinus_int() { Months test2 = Months.months(2); Months result = test2.minus(3); assertEquals(2, test2.getMonths()); assertEquals(-1, result.getMonths()); assertEquals(1, Months.ONE.minus(0).getMonths()); try { Months.MIN_VALUE.minus(1); fail(); } catch (ArithmeticException ex) { // expected } } public void testMinus_Months() { Months test2 = Months.months(2); Months test3 = Months.months(3); Months result = test2.minus(test3); assertEquals(2, test2.getMonths()); assertEquals(3, test3.getMonths()); assertEquals(-1, result.getMonths()); assertEquals(1, Months.ONE.minus(Months.ZERO).getMonths()); assertEquals(1, Months.ONE.minus((Months) null).getMonths()); try { Months.MIN_VALUE.minus(Months.ONE); fail(); } catch (ArithmeticException ex) { // expected } } public void testMultipliedBy_int() { Months test = Months.months(2); assertEquals(6, test.multipliedBy(3).getMonths()); assertEquals(2, test.getMonths()); assertEquals(-6, test.multipliedBy(-3).getMonths()); assertSame(test, test.multipliedBy(1)); Months halfMax = Months.months(Integer.MAX_VALUE / 2 + 1); try { halfMax.multipliedBy(2); fail(); } catch (ArithmeticException ex) { // expected } } public void testDividedBy_int() { Months test = Months.months(12); assertEquals(6, test.dividedBy(2).getMonths()); assertEquals(12, test.getMonths()); assertEquals(4, test.dividedBy(3).getMonths()); assertEquals(3, test.dividedBy(4).getMonths()); assertEquals(2, test.dividedBy(5).getMonths()); assertEquals(2, test.dividedBy(6).getMonths()); assertSame(test, test.dividedBy(1)); try { Months.ONE.dividedBy(0); fail(); } catch (ArithmeticException ex) { // expected } } public void testNegated() { Months test = Months.months(12); assertEquals(-12, test.negated().getMonths()); assertEquals(12, test.getMonths()); try { Months.MIN_VALUE.negated(); fail(); } catch (ArithmeticException ex) { // expected } } //----------------------------------------------------------------------- public void testAddToLocalDate() { Months test = Months.months(3); LocalDate date = new LocalDate(2006, 6, 1); LocalDate expected = new LocalDate(2006, 9, 1); assertEquals(expected, date.plus(test)); } }